<?php

namespace DreamCat\Array2Class;

use DreamCat\Array2Class\Exception\ConvertFailed;
use ReflectionAttribute;
use ReflectionClass;
use ReflectionType;

/**
 * 数组转类的接口
 * @author vijay
 */
interface Array2ClassInterface
{
    /**
     * 数据转换
     * @param mixed $data 输入的数据
     * @param string $typeName 要输出的类型名
     * @return mixed 输出的对象
     * @throws ConvertFailed 转换失败时抛出异常
     */
    public function convert(mixed $data, string $typeName): mixed;

    /**
     * 通过反射器转换
     * @param mixed $data 输入的数据
     * @param ReflectionClass $reflectionClass 要输出的类反射
     * @return object 输出的对象
     * @throws ConvertFailed 转换失败时抛出异常
     */
    public function convertByRef(mixed $data, ReflectionClass $reflectionClass): object;

    /**
     * 通过类型描述转换
     * @param mixed $data 输入的数据
     * @param ReflectionType $reflectionType 类型描述
     * @param ReflectionAttribute[] $annotations 注解列表
     * @return mixed 输出的值
     * @throws ConvertFailed 转换失败时抛出异常
     */
    public function convertByType(mixed $data, ReflectionType $reflectionType, array $annotations = []): mixed;
}

# end of file
